package br.com.vti.sisp_sicrim.antigo.controller.tela;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;

import br.com.caelum.vraptor.Result;
import br.com.vti.sisp_sicrim.antigo.controller.programa.FuncoesGerais;
import br.com.vti.sisp_sicrim.antigo.controller.programa.Scrp1000;
import br.com.vti.sisp_sicrim.antigo.model.SicCadastro;
import br.com.vti.sisp_sicrim.antigo.model.SicTabelas;
import br.com.vti.sisp_sicrim.antigo.model.Sislac01;
import br.com.vti.sisp_sicrim.antigo.util.Sessao;
import br.com.vti.sisp_sicrim.antigo.util.UtilBean;

/**
 * Classe responsavel por encapsular o tratamento e as consistencias da tela Scrm1110
 * 
 * @author Incode - Data: mai/2014
 * 
 */
public class Scrm1110 {
	private boolean enviada = false;
	private String pagina = "/resources/antigo/jsp/Scrm1110.jsp";
	private String jVersaoj;
	private String dataCorrente;
	private String jFuncaoj;
	private String horaCorrente;
	private int jContadorj;
	private int jAlarm;
	private String chave;
	private long jReggeral;
	private long jCpf;
	private String jNomeCompleto;
	private String jPmandp;
	private String jMae;
	private String jPai;
	private String jdiaNasct;
	private String jmesNasct;
	private String janoNasct;
	private int jCodMunNascimento;
	private String jUfNascimento;
	private String jNatural;
	private int jOcorrencia;
	private String jEmpresaj;
	private String jProgramaj;
	private String[] jAlcunha = new String[5];
	private String[] jObservacoes = new String[5];
	private String mensagem = "";
	private String funcao = "0";
	private String campofocus = "jregGeral";
	private String navegar = "";
	private Boolean temMensagem = false;
	private Result result;
	private Sessao sessao;
	private FuncoesGerais funcoes = new FuncoesGerais();
	// Classes views
	SicCadastro criminal = new SicCadastro();
	SicCadastro criminalView = new SicCadastro();
	SicTabelas vwTabele = new SicTabelas();
	// Classes includes
	Sislac01 sislac01 = new Sislac01();

	public Scrm1110() {
		inicializar(false);
	}

	public Scrm1110(boolean primeiraVez, Sessao sessao) {
		this.sessao = sessao;
		inicializar(primeiraVez);
	}

	public void inicializar(boolean primeiraVez) {
		if (primeiraVez) {
			jVersaoj = "";
			dataCorrente = "";
			jFuncaoj = "";
			jContadorj = 0;
			jAlarm = 0;
			chave = "";
			jReggeral = 0;
			jCpf = 0;
			jNomeCompleto = "";
			jPmandp = "";
			jMae = "";
			jPai = "";
			jdiaNasct = "";
			jmesNasct = "";
			janoNasct = "";
			jCodMunNascimento = 0;
			jUfNascimento = "";
			jNatural = "";
			Arrays.fill(jAlcunha, "");
			jOcorrencia = 0;
			Arrays.fill(jObservacoes, "");
			jEmpresaj = "";
			jProgramaj = "";
			jContadorj = sessao.getScrg001().getWContadorw();
			jEmpresaj = sessao.getScrg001().getWEmpresaw();
			jFuncaoj = sessao.getScrg001().getWFuncaow();
			jProgramaj = sessao.getScrg001().getWProgramaw();
			jVersaoj = sessao.getScrg001().getWVersaow();
		}
		horaCorrente = new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()); // *TIMX
		dataCorrente = new SimpleDateFormat("dd/MM/yyyy").format(Calendar.getInstance().getTime()); // *DATE
	}

	public boolean receberTela(boolean primeiraVez, Result result) throws Exception {
		// faz o tratamento das criticas necessarias para os dados da tela
		// recebida
		this.result = result;
		temMensagem = false;
		if (!primeiraVez) {
			return validar();
		} else {
			return true;
		}
	}

	public void enviarTela(boolean primeiraVez, Result result, String origem) {
		this.enviada = true;
		// rotina para enviar a tela
		// caso esteja setado valores para acoesFinais, executa as classes
		// correspondentes
		this.result = result;
		if (UtilBean.acoesFinais != null && !UtilBean.acoesFinais.isEmpty()) {
			UtilBean.processaAcao();
		} else {
			enviar(result, origem);
		}
	}

	public void enviar(Result result, String origem) {
		// redicionar para o jsp correspondente
		UtilBean.redireciona(pagina, result, origem);
	}

	public void enviarMensagem(String campo, String mensagem) {
		// formatar a mensagem de erro, posicionar no campo informa
		if (campo != null) {
			campofocus = campo;
		} else {
			campofocus = "";
		}
		this.mensagem = mensagem;
		temMensagem = true;
		// enviar(result, origem);
	}

	public boolean validar() throws Exception {
		// validar os campos recebidos da tela
		UtilBean.funcao = this.funcao;
		ValidarFuncao();
		if (temMensagem) {
			return false;
		}
		ValidarWanoNascT();
		if (temMensagem) {
			return false;
		}
		ValidarWcodMunNascimento();
		if (temMensagem) {
			return false;
		}
		ValidarWmae();
		if (temMensagem) {
			return false;
		}
		ValidarWnomeCompleto();
		if (temMensagem) {
			return false;
		}
		ValidarWpai();
		if (temMensagem) {
			return false;
		}
		ValidarWregGeral();
		if (temMensagem) {
			return false;
		}
		ValidarWufNascimento();
		if (temMensagem) {
			return false;
		}
		sessao.getScrg001().setWContadorw(this.jContadorj);
		sessao.getScrg001().setWEmpresaw(this.jEmpresaj);
		sessao.getScrg001().setWFuncaow(this.jFuncaoj);
		sessao.getScrg001().setWProgramaw(this.jProgramaj);
		sessao.getScrg001().setWVersaow(this.jVersaoj);
		return true;
	}

	private void ValidarFuncao() {
		// Consist�ncia F00funcao
		if (!(UtilBean.funcao.equals(UtilBean.ctt_processa) || UtilBean.funcao.equals(UtilBean.ctt_retorna))) {
			enviarMensagem(null, "");
			return;
		}
		if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
			Scrp1000 scrp1000 = new Scrp1000(result, sessao);
			scrp1000.executar(null);
		}
	}

	private void ValidarWregGeral() {
		// Consist�ncia F00#REG_GERAL
		if (chave.equals("A")) {
			if (jReggeral == 0) {
				enviarMensagem(null, "Campo de preenchimento obrigatorio");
				return;
			}
			// Par�grafo: fd1()
			criminal.consultaRegEstadualGeral(jReggeral);
			if (chave.equals("I")) {
				if (criminal.registrosProcessados() > 0) {
					enviarMensagem(null, "Registro Geral ja� cadastrado anteriormente");
					return;
				}
			}
		}
	}

	private void ValidarWnomeCompleto() {
		// Consist�ncia F00#NOME-COMPLETO
		// DEFINE DATA LOCAL
		// 1 CRIMINAL-VIEW VIEW OF SIC-CADASTRO
		// 2 REGISTRO-ESTADUAL-GERAL
		// 2 NOME-COMPLETO
		// 2 NOME-MAE
		// 2 DATA-NASC
		// 2 POLDIR 2 INDDIR 2 MEDDIR 2 ANUDIR 2 MINDIR
		// 2 INDESQ 2 MEDESQ 2 ANUESQ 2 MINESQ 2 POLESQ
		// 1 DATA-D(D) 1 AL(N2) INIT <2>
		// 1 DATA-A(A8)
		// 1 REDEFINE DATA-A
		// 2 DATA-N(N8)
		// 2 REDEFINE DATA-N
		// 3 D(N2)
		// 3 M(N2)
		// 3 A(N4)
		if (chave.equals("I"))
		// END-DEFINE
		{
			if (jNomeCompleto.trim().equals("")) {
				enviarMensagem(null, "Campo de preenchimento obrigatorio");
				return;
			}
		}
	}

	// H1. FIND (1) CRIMINAL-VIEW WITH REGISTRO-ESTADUAL-GERAL = #REG_GERAL
	// MOVE NOME-COMPLETO TO #NOME-COMPLETO
	// MOVE NOME-MAE TO #MAE
	// MOVE DATA-NASC TO DATA-N
	// MOVE EDITED DATA-A TO DATA-D(EM=YYYYMMDD)
	// MOVE EDITED DATA-D(EM=DDMMYYYY) TO DATA-A
	// MOVE D TO #DIA_NASC-T
	// MOVE M TO #MES_NASC-T
	// MOVE A TO #ANO_NASC-T
	// MOVE POLDIR TO DEDOS(1,1)
	// MOVE INDDIR TO DEDOS(2,1)
	// MOVE MEDDIR TO DEDOS(3,1)
	// MOVE ANUDIR TO DEDOS(4,1)
	// MOVE MINDIR TO DEDOS(5,1)
	// MOVE POLESQ TO DEDOS(1,2)
	// MOVE INDESQ TO DEDOS(2,2)
	// MOVE MEDESQ TO DEDOS(3,2)
	// MOVE ANUESQ TO DEDOS(4,2)
	// MOVE MINESQ TO DEDOS(5,2)
	// SET CONTROL "N" INPUT USING MAP "SCRM1100"
	// END-FIND
	// IF *COUNTER(H1.) = 0 && CHAVE = "A"
	// REINPUT "Registro Inexistente" ALARM
	// END-IF
	// PERFORM SCRSVNOM & AL
	private void ValidarWmae() {
		// Consist�ncia F00#MAE
		String wMae0;
		int wAlarm;
		int al = 3;
		wMae0 = jMae;
		if (chave.equals("I")) {
			wAlarm = 3;
			asteriscosMae();
		}
		if (chave.equals("A")) {
			wAlarm = 2;
			if (!jMae.trim().equals("")) {
				asteriscosMae();
			}
		}
	}

	private void asteriscosMae() {
		if (jMae.trim().equals("")) {
			enviarMensagem(null, "Se nao houver Nome da Mae, informe 1 asterisco");
			return;
		}
		if (UtilBean.subStr(jMae, 0, 1).equals("*")) {
			if (!UtilBean.subStr(jMae, 1, 59).trim().equals("")) {
				enviarMensagem(null, "Preencha somente com 1 asterisco");
				return;
			}
		} else {
			funcoes.scrsvnom("jmae", jMae);
			if (!funcoes.camret.equals("")) {
				enviarMensagem(funcoes.camret, funcoes.msgret);
				return;
			}
		}
	}

	private void ValidarWpai() {
		// Consist�ncia F00#PAI
		String wPai0;
		int wAlarm;
		wPai0 = jPai;
		if (chave.equals("I")) {
			wAlarm = 4;
			asteriscosPai();
		}
		if (chave.equals("A")) {
			wAlarm = 3;
			if (!jPai.trim().equals("")) {
				asteriscosPai();
			}
		}
	}

	private void asteriscosPai() {
		if (jPai.trim().equals("")) {
			enviarMensagem(null, "Se nao houver Nome da Pai, informe 1 asterisco");
			return;
		}
		if (UtilBean.subStr(jPai, 0, 1).equals("*")) {
			if (!UtilBean.subStr(jPai, 1, 59).trim().equals("")) {
				enviarMensagem(null, "Preencha somente com 1 asterisco");
				return;
			}
		} else {
			funcoes.scrsvnom("jpai", jPai);
			if (!funcoes.camret.equals("")) {
				enviarMensagem(funcoes.camret, funcoes.msgret);
				return;
			}
		}
	}

	private void ValidarWanoNascT() throws Exception {
		// Consist�ncia F00#ANO_NASC-T
		Sislac01 sislac01 = new Sislac01();
		int dddd;
		int amnas;
		String mensa;
		int datn;
		int aa = 0;
		int fa;
		String senesp;
		int wDataNasc = 0;
		int wIndex;
		String wChave;
		if (chave.equals("I")) {
			if (jdiaNasct.trim().equals("") && jmesNasct.trim().equals("") && janoNasct.trim().equals("")) {
				enviarMensagem("wDia_nascT", "Se nao tiver, preencha com zeros");
				return;
			}
			wDataNasc = Integer.valueOf(UtilBean.moveSubstring(wDataNasc, 0, 2, "N", jdiaNasct));
			wDataNasc = Integer.valueOf(UtilBean.moveSubstring(wDataNasc, 2, 2, "N", jmesNasct));
			wDataNasc = Integer.valueOf(UtilBean.moveSubstring(wDataNasc, 4, 4, "N", janoNasct));
			for (wIndex = 1; wIndex <= 8; wIndex++) {
				if (UtilBean.subStr(wDataNasc, wIndex, 1) != 0) {
					wChave = "Y";
				}
			}
			if (chave.trim().equals("")) {
				if (!String.valueOf(wDataNasc).equals("00000000")) {
					enviarMensagem("wDia_nascT", "Se nao houver, informe zeros em toda a data");
					return;
				}
			} else {
				datn = UtilBean.obtemDataCorrente();
				dddd = (UtilBean.subStr(wDataNasc, 4, 4) * 10000) + (UtilBean.subStr(wDataNasc, 2, 2) * 100) + UtilBean.subStr(wDataNasc, 0, 2);
				if (dddd > UtilBean.obtemDataCorrente()) {
					enviarMensagem("wDia_nascT", "Data de nascimento maior que a atual");
					return;
				}
				if (!UtilBean.validarMascara(dddd, "yyyyMMdd") || UtilBean.subStr(wDataNasc, 4, 4) < 1850 || UtilBean.subStr(wDataNasc, 4, 4) > aa) {
					enviarMensagem("wDia_nascT", "Data invalida");
					return;
				}
			}
		}
	}

	// IF CHAVE = " " || CHAVE.equals("A"
	// FIND (1) CRIMINAL-VIEW WITH
	// NOME-COMPLETO = #NOME-COMPLETO &&
	// NOME-MAE = #MAE &&
	// DATA-NASC = DDDD
	// ACCEPT IF REGISTRO-ESTADUAL-GERAL NE #REG_GERAL
	// COMPRESS "HOMONIMOS CADASTRADOS, RG:"
	// REGISTRO-ESTADUAL-GERAL INTO MENSA
	// END-FIND
	// END-IF
	private void ValidarWcodMunNascimento() {
		// Consist�ncia F00#COD-MUN-NASCIMENTO
		if (chave.equals("I") || chave.equals("A")) {
			if (jCodMunNascimento == 0) {
				enviarMensagem(null, "Campo de preenchimento obrigatorio");
				return;
			}
		}
	}

	private void ValidarWufNascimento() {
		// Consist�ncia F00#UF-NASCIMENTO
		if (chave.equals("I") || chave.equals("A")) {
			// Par�grafo: fd1()
			vwTabele.consultaCodigoTabelaChaveAlfaAcesso(9, jUfNascimento);
			if (criminal.registrosProcessados() == 0) {
				enviarMensagem(null, "UF nao cadastrada no Sistema");
				return;
			}
			// Par�grafo: fd2()
			vwTabele.consultaCodigoTabelaCodigoElemChaveAlfaAcesso(01, Long.valueOf(jCodMunNascimento), jUfNascimento);
			jNatural = vwTabele.getDescricaoElem();
			if (vwTabele.registrosProcessados() == 0) {
				enviarMensagem("wCodMunNascimento", "Municipio nao pertence `a UF informada");
				return;
			}
		}
	}

	public String getJversaoj() {
		return jVersaoj;
	}

	public void setJversaoj(String jVersaoj) {
		this.jVersaoj = jVersaoj;
	}

	public String getDataCorrente() {
		return dataCorrente;
	}

	public void setDataCorrente(String dataCorrente) {
		this.dataCorrente = dataCorrente;
	}

	public String getJfuncaoj() {
		return jFuncaoj;
	}

	public void setJfuncaoj(String jFuncaoj) {
		this.jFuncaoj = jFuncaoj;
	}

	public int getJcontadorj() {
		return jContadorj;
	}

	public void setJcontadorj(int jContadorj) {
		this.jContadorj = jContadorj;
	}

	public int getJalarm() {
		return jAlarm;
	}

	public void setJalarm(int jAlarm) {
		this.jAlarm = jAlarm;
	}

	public String getChave() {
		return chave;
	}

	public void setChave(String chave) {
		this.chave = chave;
	}

	public long getJregGeral() {
		return jReggeral;
	}

	public void setJregGeral(long jReggeral) {
		this.jReggeral = jReggeral;
	}

	public long getJcpf() {
		return jCpf;
	}

	public void setJcpf(long jCpf) {
		this.jCpf = jCpf;
	}

	public String getJnomecompleto() {
		return jNomeCompleto;
	}

	public void setJnomecompleto(String jNomeCompleto) {
		this.jNomeCompleto = jNomeCompleto;
	}

	public String getJpmandp() {
		return jPmandp;
	}

	public void setJpmandp(String jPmandp) {
		this.jPmandp = jPmandp;
	}

	public String getJmae() {
		return jMae;
	}

	public void setJmae(String jMae) {
		this.jMae = jMae;
	}

	public String getJpai() {
		return jPai;
	}

	public void setJpai(String jPai) {
		this.jPai = jPai;
	}

	public String getJdiaNasct() {
		return jdiaNasct;
	}

	public void setJdiaNasct(String jdiaNasct) {
		this.jdiaNasct = jdiaNasct;
	}

	public String getJmesNasct() {
		return jmesNasct;
	}

	public void setJmesNasct(String jmesNasct) {
		this.jmesNasct = jmesNasct;
	}

	public String getJanoNasct() {
		return janoNasct;
	}

	public void setJanoNasct(String janoNasct) {
		this.janoNasct = janoNasct;
	}

	public int getJcodmunnascimento() {
		return jCodMunNascimento;
	}

	public void setJcodmunnascimento(int jCodMunNascimento) {
		this.jCodMunNascimento = jCodMunNascimento;
	}

	public String getJufnascimento() {
		return jUfNascimento;
	}

	public void setJufnascimento(String jUfNascimento) {
		this.jUfNascimento = jUfNascimento;
	}

	public String getJnatural() {
		return jNatural;
	}

	public void setJnatural(String jNatural) {
		this.jNatural = jNatural;
	}

	public int getJocorrencia() {
		return jOcorrencia;
	}

	public void setJocorrencia(int jOcorrencia) {
		this.jOcorrencia = jOcorrencia;
	}

	public String getJempresaj() {
		return jEmpresaj;
	}

	public void setJempresaj(String jEmpresaj) {
		this.jEmpresaj = jEmpresaj;
	}

	public String getJprogramaj() {
		return jProgramaj;
	}

	public void setJprogramaj(String jProgramaj) {
		this.jProgramaj = jProgramaj;
	}

	public String[] getJalcunha() {
		return jAlcunha;
	}

	public void setJalcunha(String[] jAlcunha) {
		this.jAlcunha = jAlcunha;
	}

	public boolean alcunhaVazio() {
		int i;
		for (i = 1; i <= 4; i++)
			if (!jAlcunha[i].trim().equals(""))
				return false;
		return true;
	}

	public String[] getJobservacoes() {
		return jObservacoes;
	}

	public void setJobservacoes(String[] jObservacoes) {
		this.jObservacoes = jObservacoes;
	}

	public String getJalcunha(int index) {
		return jAlcunha[index];
	}

	public void setJalcunha(int index, String jAlcunha) {
		this.jAlcunha[index] = jAlcunha;
	}

	public String getJobservacoes(int index) {
		return jObservacoes[index];
	}

	public void setJobservacoes(int index, String jObservacoes) {
		this.jObservacoes[index] = jObservacoes;
	}

	public String getHoraCorrente() {
		return horaCorrente;
	}

	public void setHoraCorrente(String horaCorrente) {
		this.horaCorrente = horaCorrente;
	}

	public String getFuncao() {
		return funcao;
	}

	public void setFuncao(String funcao) {
		this.funcao = funcao;
	}

	public String getCampofocus() {
		return campofocus;
	}

	public void setCampofocus(String campofocus) {
		this.campofocus = campofocus;
	}

	public String getNavegar() {
		return navegar;
	}

	public void setNavegar(String navegar) {
		this.navegar = navegar;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public void setMensagemSaida(String mensagem) {
		this.mensagem = mensagem;
	}

	public boolean getEnviada() {
		return this.enviada;
	}

	public void setSessao(Sessao sessao) {
		this.sessao = sessao;
	}

}
